<?php
/**
 * RBAC基于角色的访问控制接口
 * 
 * @author Leo
 * 
 */

interface IRbac {
	/**
	 * 注册资源到rbac系统
	 * @param string $resource 资源,如果资源注册表中存在该资源,则执行修改操作
	 * @param string $name 名称
	 * @param array $ops 操作格式为key=>value
	 * @param array $extra 额外信息,可以保存用户自定义信息,以key=>value方式提供
	 * @param array $note 备注(啥玩意都要备注)
	 * @return boolean 
	 */
	function register($resource, $name, $ops, $extra, $note);
	/**
	 * 从资源注册表中删除$resource指定的资源,同时清空资源分配表
	 * 
	 * @param string $resource
	 * @return boolean 
	 */
	function unregister($resource);
	/**
	 * 为访问者分配权限
	 * @param array $ops 权限
	 * @param string $resource 资源
	 * @param mixed $id 访问者标识,建议使用int或string型,长度不应长于32
	 * @param mixed $type 访问者类型,可自定义
	 * @param array $extra 额外信息
	 * @return boolean 
	 */
	function grant($ops, $resource, $id, $type, $extra);
	/**
	 * 收回访问者权限
	 * @param array $ops 要收回的权限
	 * @param string $resource
	 * @param mixed $id 访问者标识,建议使用int或string型,长度不应长于32
	 * @param mixed $type 访问者类型,可自定义
	 * @return boolean 
	 */
	function revoke($ops, $resource, $id, $type);	
	/**
	 * Can I do some operation on resource? If I can return true, else return false
	 * 在使用方法之前,请先调用load以加载用户的资源访问表
	 * @param string $op 操作
	 * @param string $resource 资源
	 * @param mixed $id 访问者标识,建议使用int或string型,长度不应长于32
	 * @return boolean 
	 */
	function icando($op, $resource, $id, $extra = array());
	/**
	 * 加用户资源分配表
	 * @param mixed $id 访问者标识,建议使用int或string型,长度不应长于32	
	 * @param array $types 用户可能属于的组,部门,城市等等
	 * @return boolean
	 */
	function privileges($id, $types);
}
/**
 * Can I do some operation on resource? If I can return true, else return false
 * 
 * @param string $op 操作
 * @param string $resource 资源
 * @param array  $extra key=>value形式的额外信息
 * @return boolean 
 */
function icando($op, $resource, $extra = array()) {
	$I = whoami ();
	return $I->cando ( $op, $resource, $extra );
}
/**
 * Can you/she/he do some operation on resource? If I can return true, else return false
 * 
 * @param string $op 操作
 * @param string $resource 资源
 * @param array  $extra key=>value形式的额外信息
 * @param mixed $id 访问者标识,建议使用int或string型,长度不应长于32	
 * @return boolean 
 */
function ucando($op, $resource, $extra, $id) {
	global $__rbac;
	if ($__rbac == null) {
		$ioc = get_current_ioc ();
		$__rbac = $ioc->get ( 'rbac' );
	}
	if ($__rbac && method_exists ( $__rbac, 'icando' )) {
		return $__rbac->icando ( $op, $resource, $id, $extra );
	}
	return false;
}